/*******************************************************************************
 * Classe Laser : classe de création et de gestion du laser
 ******************************************************************************/
package Armes;

import java.awt.*;
import java.util.logging.*;
import javax.swing.JOptionPane;
import prjintwg.Jeu;
import ElementsDeJeu.MessageSpecial;
import ElementsDeJeu.Microphone;
import ElementsDeJeu.Personnage;
import prjintwg.PnlJeu;

/**
 *
 * @author W&G
 */
public class Laser extends Arme {

    protected int positionX2 = 0;//position de l'avant du laser en x
    protected int positionY2 = 0;//position de l'arriere du laser en y
    //processus de déplacement du laser
    protected ThreadDeplacement threadDeplacement = new ThreadDeplacement();
    protected MessageSpecial mS;//Message spécial à afficher lors de l'impact du laser avec un élément
    protected int index = 1;//Index renvoyant à l'explosion désirée
    protected int rayonExplosion = 15;//rayon de l'explosion du laser
    //processus de l'explosion du laser
    protected Thread threadExplosion = new ThreadExplosion();
    private Microphone microphone;//Microphone utilisé pour capter le son
/**
 * Constructeur du laser
 * @param positionX position initiale du laser en x
 * @param positionY position initiale du laser en y
 * @param pnlJeu panneau contenant le jeu
 */
    public Laser(int positionX, int positionY, PnlJeu pnlJeu) {
        this.positionX = positionX;
        this.positionX2 = positionX;
        this.positionY = positionY;
        this.positionY2 = positionY;
        this.pnlJeu = pnlJeu;
        this.puissance = 0.6;
        if (pnlJeu.getViseeLaser() != null) {
            pnlJeu.getViseeLaser().setPosition(positionX, positionY, Jeu.getTourTir());
        }
        microphone = new Microphone(pnlJeu, 0);
    }
/**
 * Calcul de la position du laser en x
 */
    protected void calculPositionX2() {
        this.positionX2 += Math.cos(angleRad) * 12;
    }
/**
 * Calcul de la position du laser en y
 */
    protected void calculPositionY2() {
        this.positionY2 += Math.sin(angleRad) * 12;
    }
/**
 * Calcul du mouvement du projectile
 */
    @Override
    protected void calculerMouvement() {
        calculPositionX2();
        calculPositionY2();
    }
/**
 * Lance le déplacement du laser en fonction de l'angle
 * @param angle angle de lancement du laser
 */
    public void deplacement(double angle) {
        angleRad = angle * Math.PI / 180;
        threadDeplacement = new ThreadDeplacement();
        threadDeplacement.start();
    }
/**
 * Retourne le laser
 * @return Retourne le laser
 */
    protected Laser getLaser() {
        return this;
    }
/**
 * Retourne le processus de déplacement
 * @return retourne le processus de déplacement
 */
    public ThreadDeplacement getThreadDeplacement() {
        return threadDeplacement;
    }
/**
 * Processus de l'explosion du laser
 */
    protected class ThreadExplosion extends Thread {

        @Override
        public void run() {
            for (int i = 0; i <= 30; i = i + 3) {
                pnlJeu.getExplosion(index).setPosSize(positionX2 - 20 - i / 2, pnlJeu.getF().getHeight() - positionY2 - i / 2 - rayonExplosion, 40 + i, 40 + i);
                pnlJeu.getF().repaint(positionX - 50,
                        pnlJeu.getF().getHeight() - positionY - 25, 100, 100);
                try {
                    sleep(40);
                } catch (InterruptedException ex) {
                }
            }
            pnlJeu.getExplosion(index).setPosSize(-50, -50, 40, 40);
            pnlJeu.getF().repaint(positionX - 50,
                    pnlJeu.getF().getHeight() - positionY - 25, 100, 100);
        }
    }
/**
 * Processus de déplacement du laser
 */
    protected class ThreadDeplacement extends Thread {

        @Override
        public void run() {
            pnlJeu.getBtnDeplacement().setEnabled(false);
            pnlJeu.getCboArmes().setEnabled(false);
            while (!estEnDehors(getLaser()) && (getPuissance() != 0) && !touche(pnlJeu.getPersonnage2(), getLaser()) && !touche(pnlJeu.getPersonnage1(), getLaser())) {
                pnlJeu.getF().repaint(positionX2 - 50,
                        pnlJeu.getF().getHeight() - positionY2 - 25, 100, 100);

                calculerMouvement();
                try {
                    sleep(10);
                } catch (InterruptedException ex) {
                }
            }
            if (touche(pnlJeu.getPersonnage1(), getLaser())) {
                pnlJeu.personnage1Touche((int) (puissance * 100), 1000, pnlJeu.getPersonnage2().getForce());
                try {
                    mS = new MessageSpecial("Ouch.PNG");
                    microphone.playSound("ouch.wav");
                    mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                    if (Jeu.getTourTir() % 2 == 0) {
                        mS = new MessageSpecial("EpicFail.PNG");
                        microphone.playSound("EpicFail.wav");
                        mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                    }
                } catch (Exception e) {
                    System.out.println("Erreur de chargement du message spécial");
                }
            } else if (touche(pnlJeu.getPersonnage2(), getLaser())) {
                pnlJeu.personnage2Touche((int) (puissance * 100), 1000, pnlJeu.getPersonnage1().getForce());
                try {
                    mS = new MessageSpecial("Ouch.PNG");
                    microphone.playSound("ouch.wav");
                    mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                    if (Jeu.getTourTir() % 2 == 1) {
                        mS = new MessageSpecial("EpicFail.PNG");
                        microphone.playSound("EpicFail.wav");
                        mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                    }
                } catch (Exception e) {
                    System.out.println("Erreur de chargement du message spécial");
                }
            } else {
                try {
                    mS = new MessageSpecial("Fail.PNG");
                    microphone.playSound("Fail.wav");
                    mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
                } catch (Exception e) {
                    System.out.println("Erreur de chargement du message spécial");
                }
            }
            threadExplosion.start();
            mS.setBounds(350, 100, 330, 125);
            pnlJeu.add(mS);
            if (pnlJeu.getPersonnage1().getPv() <= 0 || pnlJeu.getPersonnage2().getPv() <= 0) {
                try {
                        pnlJeu.remove(mS);
                        microphone.playSound("Destroyed.wav");
                        mS = new MessageSpecial("Destroyed.PNG");
                        mS.setBounds(300, 100, 440, 160);
                        pnlJeu.add(mS);
                        sleep(1000);
                        switch (JOptionPane.showConfirmDialog(null, "Voulez vous recommencer ?")) {
                            case 0:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                break;
                            case 1:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            case 2:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            case -1:
                                pnlJeu.remove(mS);
                                pnlJeu.mettreAZero();
                                pnlJeu.getF().afficherMenuPrincipal();
                                break;
                            default:
                                pnlJeu.getBtnDeplacement().setEnabled(false);
                        }
                } catch (Exception e) {
                    System.out.println("Erreur de chargement du message spécial");
                }
            }
            pnlJeu.nouveauProjectile();
            pnlJeu.getF().repaint();
            try {
                sleep(1000);
                pnlJeu.remove(mS);
            } catch (InterruptedException ex) {
                Logger.getLogger(Jeu.class.getName()).log(Level.SEVERE, null, ex);
            }          
            pnlJeu.getBtnDeplacement().setEnabled(true);
            pnlJeu.getCboArmes().setEnabled(true);
            pnlJeu.getF().repaint();
        }
    }
/**
 * Vérifie si le laser est en dehors de l'écran ou non
 * @param laser le laser désiré
 * @return vrai si en dehors, faut si toujours dans l'écran
 */
    protected boolean estEnDehors(Laser laser) {
        if (positionX2 > 1070 || positionX2 < 0 || positionY2 > 700 || positionY2 < 0) {
            return true;
        } else {
            return false;
        }
    }
/**
 * Vérifie si le laser touche un personnage
 * @param p personnage touché
 * @param laser laser utilisé
 * @return vrai si touche un personnage, sinon faut
 */
    protected boolean touche(Personnage p, Laser laser) {
        if (getPuissance() != 0) {
            if ((positionX2 >= p.getPosX() - 16 && positionX2 <= (p.getPosX())) && (positionY2 <= p.getPosY() && positionY2 >= (p.getPosY() - 32))) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }

    }

    @Override
    public void paintComponent(Graphics g) {//dessine le laser
        g.setColor(new Color(100, 0, 100));
        g.drawLine(this.positionX+7, TAILLEFENETRE - this.positionY+5, this.positionX2+7, TAILLEFENETRE - this.positionY2+5);
    }
}
